#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>

/*********************************************
Autor : Henrique Nishi - hsnishi@gmail.com
        Leandro Machado - l.fvm23@gmail.com
Descrição : Cria 1 vetor de tamanho 125 com números randomicos, envia para os servidores de nível 1, espera o vetor de 1000 e imprime-o.
*********************************************/

int main (int argc, char *argv[]){

	int vetor [125], vetor2[1000], numbyte, i, sock, vetor_desordenado[125];
	long int t_total, t_comunicacao[2];
	struct hostent *host;
	struct sockaddr_in server_addr;
	struct timeval inicio_total, final_total, inicio_comunicacao[2], final_comunicacao[2];
	time_t t;
	
	if (argc < 2)
    {
        printf("Falta de argumentos");
        exit(0);
    }
	
	// Pega o tempo inicial total
	gettimeofday (&inicio_total, NULL);
	
	// Inicializa o random
	srand((unsigned) time(&t));

	// Gera um vetor de 125 numeros aleatorios
	for (i=0; i<125; i++)
	{
		vetor[i] = rand() % 10000;
		vetor_desordenado[i] = vetor[i];
	}
	
	// Endereço IP do Host
	host = gethostbyname(argv[1]);

	// Cria um Socket
	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		perror("Erro de Socket");
		exit(1);
	}

	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(atoi(argv[2]));
	server_addr.sin_addr = *((struct in_addr *)host->h_addr);
	bzero(&(server_addr.sin_zero),8);
	
	
	//Cria uma Conexao
	if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
	{
	  perror("Erro de conexao");
	  exit(1);
	}
	
	// Pega o tempo inicial de comunicação
	gettimeofday (&inicio_comunicacao[0], NULL);
	
	// Envia o vetor com 125 numeros aleatorios para um servidor
	send (sock, vetor, 125*4, 0);
	
	// Pega o tempo final de comunicação
	gettimeofday (&final_comunicacao[0], NULL);
	
	// Pega o tempo inicial de comunicação
	gettimeofday (&inicio_comunicacao[1], NULL);
	
	// Recebe o vetor com 1000 numeros ordenados do servidor
	recv (sock, vetor2, 1000*4, MSG_WAITALL);

	// Pega o tempo final de comunicação
	gettimeofday (&final_comunicacao[1], NULL);
	
	//Fecha o Socket
	close(sock);
	printf("Vetor ordenado : \n");
	// Mostra o vetor[1000] ordenado
	for (i=0; i<1000; i++)
		printf("%d\n", vetor2[i]);
	
	// Pega o tempo final total
	gettimeofday (&final_total,NULL);
	
	// Calcula os tempos em milissegundos
	t_comunicacao[0] = (long int)(1000000*(final_comunicacao[0].tv_sec - inicio_comunicacao[0].tv_sec) + (final_comunicacao[0].tv_usec - inicio_comunicacao[0].tv_usec));
	t_comunicacao[1] = (long int)(1000000*(final_comunicacao[1].tv_sec - inicio_comunicacao[1].tv_sec) + (final_comunicacao[1].tv_usec - inicio_comunicacao[1].tv_usec));
	t_total = (long int)(1000000*(final_total.tv_sec - inicio_total.tv_sec) + (final_total.tv_usec - inicio_total.tv_usec));
	
	// Mostra os tempos de comunicacao e execução
	printf("\nTempo de comunicacao - %li microssegundos\n", t_comunicacao[0]);
	printf("\nTempo de comunicacao - %li microssegundos\n", t_comunicacao[1]);
	printf("\nTempo total - %li microssegundos\n", t_total);	
	
	return 0;
}


